﻿
#ifndef __KeyUtility_H__
#define __KeyUtility_H__

#pragma comment( lib, "winmm.lib" )

#include "conio.h"
#include <windows.h>
#include <iostream>
using namespace std;


//Keys
typedef enum GKeys
{
	KEY_A    =0x41,
	KEY_B    =0x42,
	KEY_C    =0x43,
	KEY_D    =0x44,
	KEY_E    =0x45,
	KEY_F    =0x46,
	KEY_G    =0x47,
	KEY_H    =0x48,
	KEY_I    =0x49,
	KEY_J    =0x4A,
	KEY_K    =0x4B,
	KEY_L    =0x4C,
	KEY_M    =0x4D,
	KEY_N    =0x4E,
	KEY_O    =0x4F,
	KEY_P    =0x50,
	KEY_Q    =0x51,
	KEY_R    =0x52,
	KEY_S    =0x53,
	KEY_T    =0x54,
	KEY_U    =0x55,
	KEY_V    =0x56,
	KEY_W    =0x57,
	KEY_X    =0x58,
	KEY_Y    =0x59,
	KEY_Z    =0x5A,
	KEY_LEFT    =VK_LEFT,
	KEY_RIGHT   =VK_RIGHT,
	KEY_UP      =VK_UP,
	KEY_DOWN    =VK_DOWN,
	KEY_ESC     =VK_ESCAPE,
	KEY_ENTER	=VK_RETURN,
	KEY_SPACE	=VK_SPACE,
	KEY_DELETE	=VK_DELETE,
} GKeys;

//mảng trạng thái của các phím
bool g_ArrKeys[256];

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

//declare

bool GIsKeyDown(int vkCode);
bool GIsKeyUp(int vkCode);
bool GIsKeyPress(GKeys vKey);
bool GIsKeyRelease(GKeys vKey);
bool GIsElapsed(long elapsedMilisecond);
float GGetFPS();




//Kiểm tra trạng thái phím có đang down
bool GIsKeyDown(int vkCode)
{
	return (GetAsyncKeyState(vkCode) & 0x8000);
}



//Kiểm tra trạng thái phím có đang up
bool GIsKeyUp(int vkCode)
{
	return (!(GetAsyncKeyState(vkCode) & 0x8000));
}



//Kiểm tra xem có phím vKey vừa nhấn ko
bool GIsKeyPress(GKeys vKey)
{
	bool res = false;

	if(vKey < 0 || vKey > 255)
		return false;

	if(GetKeyState(vKey) & 0xff00)
	{
		if(g_ArrKeys[vKey] == false)
			res = true;
		else
			res = false;

		g_ArrKeys[vKey] = true;
	} 
	else
	{
		res = false;
		g_ArrKeys[vKey] = false;
	}

	return res;
}



//Kiểm tra xem có phím vKey vừa thả ra ko
bool GIsKeyRelease(GKeys vKey)
{
	bool res = false;

	if(vKey < 0 || vKey > 255)
		return false;

	if(GetKeyState(vKey) & 0xff00)
	{
		res = false;
		g_ArrKeys[vKey] = true;
	} 
	else
	{
		if(g_ArrKeys[vKey] == true)
			res = true;
		else
			res = false;

		g_ArrKeys[vKey] = false;
	}

	return res;
}

#endif //__KeyUtility_H__
